package com.csun.cmny.provider.service.impl;

import com.csun.cmny.base.dto.LoginAuthDto;
import com.csun.cmny.base.enums.ErrorCodeEnum;
import com.csun.cmny.core.support.BaseService;
import com.csun.cmny.provider.dao.DmcRoomAlertSilentTimeMapper;
import com.csun.cmny.provider.exceptions.DmcBizException;
import com.csun.cmny.provider.model.constant.LifeConstant;
import com.csun.cmny.provider.model.domain.DmcRoomAlertSilentRecord;
import com.csun.cmny.provider.model.domain.DmcRoomAlertSilentTime;
import com.csun.cmny.provider.model.dto.life.RoomAlertStatusDto;
import com.csun.cmny.provider.model.vo.life.RoomAlertTimeVO;
import com.csun.cmny.provider.service.DmcRoomAlertSilentRecordService;
import com.csun.cmny.provider.service.DmcRoomAlertSilentTimeService;
import com.csun.cmny.provider.utils.DateUtil;
import com.csun.cmny.util.RedisKeyUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
@Transactional
public class DmcRoomAlertSilentTimeServiceImpl extends BaseService<DmcRoomAlertSilentTime> implements DmcRoomAlertSilentTimeService {

    @Resource
    private DmcRoomAlertSilentTimeMapper dmcRoomAlertSilentTimeMapper;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private DmcRoomAlertSilentRecordService dmcRoomAlertSilentRecordService;

    @Override
    public RoomAlertTimeVO getRoomAlertStatus(Long roomId) {

        RoomAlertTimeVO vo = new RoomAlertTimeVO();

        //查询当前屏蔽状态
        if(redisTemplate.hasKey(RedisKeyUtil.getDmcRoomAlertSilentTime(roomId))){
            DmcRoomAlertSilentRecord record = (DmcRoomAlertSilentRecord)redisTemplate.opsForValue().get(RedisKeyUtil.getDmcRoomAlertSilentTime(roomId));
            vo.setSilentStatus(LifeConstant.ROOM_SILENT);
            vo.setSilentTime(record.getSilentTime());
            vo.setStartTime(DateUtil.dateToString(record.getStartTime()));
            vo.setEndTime(DateUtil.dateToString(record.getEndTime()));
        }

        //查询屏蔽时间配置
        DmcRoomAlertSilentTime dmcRoomAlertSilentTime = selectByKey(roomId);
        if(dmcRoomAlertSilentTime != null){
            vo.setDefaultSilentTime(dmcRoomAlertSilentTime.getSilentTime());
        }

        return vo;
    }

    @Override
    public Integer setgetRoomAlertStatus(RoomAlertStatusDto dto, LoginAuthDto loginAuthDto) {

        if(redisTemplate.hasKey(RedisKeyUtil.getDmcRoomAlertSilentTime(dto.getRoomId()))){
            throw new DmcBizException(ErrorCodeEnum.DMC100613003);
        }

        //设置屏蔽起止时间
        Date now = new Date();
        Date endTime = DateUtil.dateAddMinute(now,dto.getSilentTime());

        //将记录放入数据库
        DmcRoomAlertSilentRecord record = new DmcRoomAlertSilentRecord();
        record.setRoomId(dto.getRoomId().intValue());
        record.setCreator(loginAuthDto.getUserName());
        record.setCreatorId(loginAuthDto.getUserId());
        record.setSilentTime(dto.getSilentTime());
        record.setStartTime(now);
        record.setEndTime(endTime);
        int ret = dmcRoomAlertSilentRecordService.save(record);

        //将当前的屏蔽设置放入redis
        redisTemplate.opsForValue().set(RedisKeyUtil.getDmcRoomAlertSilentTime(dto.getRoomId()),record,dto.getSilentTime(), TimeUnit.MINUTES);

        //更新屏蔽配置时间
        DmcRoomAlertSilentTime config = new DmcRoomAlertSilentTime();
        config.setRoomId(dto.getRoomId());
        config.setSilentTime(dto.getSilentTime());
        int i = saveOrUpdate(config);

        return ret;
    }

    @Override
    public Integer deleteRoomAlertStatus(Long roomId, LoginAuthDto loginAuthDto) {

        if(!redisTemplate.hasKey(RedisKeyUtil.getDmcRoomAlertSilentTime(roomId))){
            throw new DmcBizException(ErrorCodeEnum.DMC100613004);
        }

        DmcRoomAlertSilentRecord record = (DmcRoomAlertSilentRecord)redisTemplate.opsForValue().get(RedisKeyUtil.getDmcRoomAlertSilentTime(roomId));

        //更新记录结束时间
        Date now = new Date();
        record.setEndTime(now);
        record.setLastOperator(loginAuthDto.getUserName());
        record.setLastOperatorId(loginAuthDto.getUserId());
        int update = dmcRoomAlertSilentRecordService.update(record);

        //删除屏蔽Key
        redisTemplate.delete(RedisKeyUtil.getDmcRoomAlertSilentTime(roomId));

        return update;
    }

    @Override
    public Integer setRoomSilentTime(RoomAlertStatusDto dto, LoginAuthDto loginAuthDto) {
        DmcRoomAlertSilentTime config = new DmcRoomAlertSilentTime();
        config.setRoomId(dto.getRoomId());
        config.setSilentTime(dto.getSilentTime());
        return saveOrUpdate(config);
    }

    private int saveOrUpdate(DmcRoomAlertSilentTime config) {
        DmcRoomAlertSilentTime dmcRoomAlertSilentTime = selectByKey(config.getRoomId());
        if(dmcRoomAlertSilentTime == null){
            return dmcRoomAlertSilentTimeMapper.insertSelective(config);
        }else{
            return dmcRoomAlertSilentTimeMapper.updateByPrimaryKeySelective(config);
        }
    }
}
